package com.qiangzhi.valid;

import com.qiangzhi.annotation.File;
import com.qiangzhi.constant.MessageConstant;
import com.qiangzhi.constant.NumberConstant;
import com.qiangzhi.enums.FileType;
import com.qiangzhi.exception.BaseException;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * File注解具体校验逻辑的实现类
 */
public class FileValid implements ConstraintValidator<File, MultipartFile> {

    // 文件格式
    private static final String XLS_FORMAT = ".xls";
    private static final String XLSX_FORMAT = ".xlsx";
    private static final String JPG_FORMAT = ".jpg";

    private FileType fileType; // 文件类型
    private boolean isEmpty; // 是否可以为空

    /**
     * 获取到使用注解时设置的约束
     *
     * @param constraintAnnotation 可以获取到注解设置的约束
     */
    @Override
    public void initialize(File constraintAnnotation) {
        this.fileType = constraintAnnotation.type();
        this.isEmpty = constraintAnnotation.empty();
    }

    /**
     * 具体校验逻辑
     *
     * @param file                       需要检验的文字
     * @param constraintValidatorContext 校验结果的提示信息 使用注解时已经指明了错误提示信息 一般不需要使用
     * @return 校验成功或失败
     */
    @Override
    public boolean isValid(MultipartFile file, ConstraintValidatorContext constraintValidatorContext) {
        // 文件可以为空 判断文件是否为空
        if (isEmpty) {
            // 判断文件是否为空
            if (file == null || file.isEmpty()) return true;
        }

        if (fileType == FileType.EXCEL) { // excel文件校验
            // 文件为空抛上传文件失败异常
            if (file == null || file.isEmpty()) throw new BaseException(MessageConstant.UPLOAD_FAILED);

            // 文件不以.xls .xlsx结尾 抛文件格式错误异常
            String fileName = file.getOriginalFilename();
            if (!(fileName.endsWith(XLS_FORMAT) || fileName.endsWith(XLSX_FORMAT))) {
                throw new BaseException(MessageConstant.UPLOAD_FORMAT_FAILED);
            }

            // 文件过大抛文件大小超过10MB异常
            long fileSize = file.getSize() / NumberConstant.ONE_BYTE / NumberConstant.ONE_BYTE;
            if (fileSize > NumberConstant.TEN) throw new BaseException(MessageConstant.UPLOAD_SIZE_FAILED);

            return true; // 无异常抛出 不再校验
        }

        if (fileType == FileType.JPG) { // jpg文件校验
            // 文件不以.jpg结尾 抛文件格式错误异常
            String fileName = file.getOriginalFilename();
            if (!fileName.endsWith(JPG_FORMAT)) throw new BaseException(MessageConstant.UPLOAD_FORMAT_FAILED);

            // 文件过大抛文件过大异常
            long fileSize = file.getSize() / NumberConstant.ONE_BYTE / NumberConstant.ONE_BYTE;
            if (fileSize > NumberConstant.TWO) throw new BaseException(MessageConstant.UPLOAD_SIZE_FAILED);

            return true; // 无异常抛出 不再校验
        }

        return false;
    }

}
